package com.hspedu.map_;

import com.sun.javafx.collections.MappingChange;

import java.util.Collection;
import java.util.HashMap;
import java.util.Map;
import java.util.Set;

/**
 * @Author Stringzhua
 * @Date 2024/3/12 20:17
 * description:
 */
@SuppressWarnings("all")
public class MapSource_ {
    public static void main(String[] args) {
        HashMap map = new HashMap();
        map.put("no1", "韩顺平");//key-value
        map.put("no2", "张无忌");//key-value
        map.put(new Car(), new Person());


        /*
         * 阅读源码,老师解读
         * 1.k-v 最后是HashMap$Node node= newNode(hash,key,value,null)
         * 2.k-v 为了方便程序员的遍历,还会 在底层创建EntrySet集合,该集合存放的元素类型是 Entry
         * 而一个Entry对象就有k,v EntrySet<Entry<K,V>> 即:transient Set<Map.Entry<K,V>> entrySet;
         * 3.在EntrySet中,定义的类型是Map.Entry,但是实际上存放的还是HashMap$Node
         * 这是因为static class Node<K,V> implements Map.Entry<K,V>
         * 4.当把NodeMap$Node 对象存放到 entrySet 就方便我们的遍历,因为Map.Entry提供了两个重要的方法
         *   V getKey();
         *   V getValue();
         *
         * */


        Set set = map.entrySet();
        System.out.println(set.getClass());//class java.util.HashMap$EntrySet
        for (Object object : set) {
//            System.out.println(object.getClass());//class java.util.HashMap$Node
            //为了从HashMap$Node中取出k-v
            //1.先做一个向下转型
            Map.Entry entry = (Map.Entry) object;
            System.out.println(entry.getKey() + "-" + entry.getValue());
        }
        Set set1 = map.keySet();
        System.out.println(set1.getClass());//class java.util.HashMap$KeySet
        Collection values = map.values();
        System.out.println(values.getClass());//class java.util.HashMap$Values
    }
}

class Car {

}

class Person {

}